perm filename POOLTY.TEX[WEB,ALS] blob sn#664692 filedate 1982-06-24 generic text, type T, neo UTF8
\input webhdr
% This program by D. E. Knuth is not copyrighted and can be used freely.
% Version 1 was implemented in June 1982.

% Here is TeX material that gets inserted after \input webhdr
\def\hang{\hangindent 3em\ \unskip\!}
\chcode@=13 \def@{\penalty999\ } % ties words together
\def\TeX{T\hbox{\hskip-.1667em\lower.424ex\hbox{E}\hskip-.125em X}}
\font b=cmr9 \def\mc{\:b} % medium caps for names like PASCAL
\def\PASCAL{{\mc PASCAL}}

\def\(#1){} % this is used to make module names sort themselves better
\def\9#1{} % this is used for sort keys in the index

\font D=cmtt at 15truept % font used in the title line below (only)
\font E=cmr7 at 14truept % font used in the title line below (only)

\def\title{POOL\lowercase{type}}
\def\contentspagenumber{101}
\def\topofcontents{\topspace 0pt
	\vfill
	\ctrline{\:E The {\:D POOLtype} processor}
	\vskip 15pt
	\ctrline{(Version 1, June 1982)}
	\vfill}
\def\botofcontents{\vfill
	\ctrline{\ragged0\spaceskip0pt\xspaceskip0pt\baselineskip9pt
		\hbox par 5in{\:b
		The preparation of this report
		was supported in part by the National Science
		Foundation under grants IST-7921977 and MCS-7723738;
		by Office of Naval Research grant N00014-81-K-0330;
		and by the System Development Foundation. `\TeX' is a
		trademark of the American Mathematical Society.}}}
\setcount0 \contentspagenumber
\topofcontents
\ctrline{(replace this page by the contents page printed later)}
\botofcontents
\mark{1}\eject

\N1.  Introduction.
The \.{POOLtype} utility program converts string pool files output
by \.{TANGLE} into a slightly more symbolic format that may be useful
when \.{TANGLE}d programs are being debugged.

It's a pretty trivial routine, but people may want to try transporting
this program before they get up enough courage to tackle \TeX\ itself.
The first 128 strings are treated as \TeX\ treats them, using routines
copied from \TeX82.


\M2. This program is written entirely in standard \PASCAL, except that it has
to do some slightly system-dependent character code conversion on input
and output. The input is read from \\{pool\_file}, and the output is written
on \\{output}. If the input is erroneous, the \\{output} file will describe
the error.

\Y\P$\hbox{\4}\B\$\|D-\T$\C{no debugging overhead}\6
\4\&{program}\1\  \37$\\{POOLtype}(\\{pool\_file},\39\\{output})$;\6
\4\&{label} \379999;\C{this labels the end of the program}\6
\4\&{type} \37\X5:Types in the outer block\X\6
\4\&{var} \37\X7:Globals in the outer block\X\6
\4\&{procedure}\1\  \37\\{initialize};\C{this procedure gets things started
properly}\6
\4\&{var} \37\X6:Local variables for initialization\X\2\6
\&{begin} \37\X8:Set initial values of key variables\X\6
\&{end};\par


\M3. Here are some macros for common programming idioms.

\Y\P\D \37$\\{incr}(\#)\S\#\K\#+1$\C{increase a variable by unity}\par
\P\D \37$\\{decr}(\#)\S\#\K\#-1$\C{decrease a variable by unity}\par
\P\D \37$\\{do\_nothing}\S$\C{empty statement}\par

\N4.  The character set.
(The following material is copied verbatim from \TeX82.
Thus, the same system-dependent changes should be made to both programs.)

In order to make \TeX\ readily portable between a wide variety of
computers, all of its input text is converted to an internal seven-bit
code that is essentially standard ascii, the ``American Standard Code for
Information Interchange.''  This conversion is done immediately when each
character is read in. Conversely, characters are converted from ascii to
the user's external representation just before they are output to a
text file. 

Such an internal code is relevant to users of \TeX\ primarily because it
governs the positions of characters in the fonts. For example, the
character `\.A' has ascii code $65=\O101$, and when \TeX\ typesets
this letter it specifies character number 65 in the current font.
If that font actually has `\.A' in a different position, \TeX\ doesn't
know what the real position is; the program that does the actual printing from
\TeX's device-independent files is responsible for converting from ascii to
a particular font encoding.

\TeX's internal code is relevant also with respect to constants
that begin with a reverse apostrophe; and it provides an index to the
\.{\\chcode}, \.{\\mathcode}, \.{\\uccode}, \.{\\lccode}, and \.{\\delcode}
tables.


\M5. Characters of text that have been converted to \TeX's internal form 
are said to be of type \\{ascii\_code}, which is a subrange of the integers.

\Y\P$\4\X5:Types in the outer block\X\S$\6
$\\{ascii\_code}=0\to127$;\C{seven-bit numbers}\par
\U section 2.

\M6. The original \PASCAL\ compiler was designed in the late 60s, when six-bit
character sets were common, so it did not make provision for lower case
letters. Nowadays, of course, we need to deal with both upper and lower case
alphabets in a convenient way, especially in a program for typesetting;
so the present specification of \TeX\ has been written under the assumption
that the \PASCAL\ compiler and run-time system permit the use of text files
with more than 64 distinguishable characters. More precisely, we assume that
the character set contains at least the letters and symbols associated
with ascii codes \O40 through \O176; all of these characters are now
available on most computer terminals.

Since we are dealing with more characters than were present in the first
\PASCAL\ compilers, we have to decide what to call the associated data
type. Some \PASCAL s use the original name \\{char} for the
characters in text files, even though there now are more than 64 such
characters, while other \PASCAL s consider \\{char} to be a 64-element
subrange of a larger data type that has some other name.

In order to accommodate this difference, we shall use the name \\{text\_char}
to stand for the data type of the characters that are converted to and
from \\{ascii\_code} when they are input and output. We shall also assume
that \\{text\_char} consists of the elements $\\{chr}(\\{first\_text\_char})$
through
$\\{chr}(\\{last\_text\_char})$, in\-clu\-sive. The following definitions
should be
adjusted if necessary.

\Y\P\D \37$\\{text\_char}\S\\{char}$\C{the data type of characters in text
files}\par
\P\D \37$\\{first\_text\_char}=0$\C{ordinal number of the smallest element of \\
{text\_char}}\par
\P\D \37$\\{last\_text\_char}=127$\C{ordinal number of the largest element of \\
{text\_char}}\par
\Y\P$\4\X6:Local variables for initialization\X\S$\6
\4\|i: \37$0\to\\{last\_text\_char}$;\par
\U section 2.

\M7. The \TeX\ processor converts between ascii code and
the user's external character set by means of arrays \\{xord} and \\{xchr}
that are analogous to \PASCAL's \\{ord} and \\{chr} functions.

\Y\P$\4\X7:Globals in the outer block\X\S$\6
\4\\{xord}: \37\&{array} $[\\{text\_char}]$ \1\&{of}\5
\\{ascii\_code};\C{specifies conversion of input characters}\2\6
\4\\{xchr}: \37\&{array} $[\\{ascii\_code}]$ \1\&{of}\5
\\{text\_char};\C{specifies conversion of output characters}\2\par
\A sections 12 and 16.
\U section 2.

\M8. Since we are assuming that our \PASCAL\ system is able to read and write
the
visible characters of standard ascii (although not necessarily using the
ascii codes to represent them), the following assignment statements initialize
most of the \\{xchr} array properly, without needing any system-dependent
changes.

\Y\P$\4\X8:Set initial values of key variables\X\S$\6
$\\{xchr}[\O40]\K\.{\'\ \'}$;\5
$\\{xchr}[\O41]\K\.{\'!\'}$;\5
$\\{xchr}[\O42]\K\.{\'"\'}$;\5
$\\{xchr}[\O43]\K\.{\'\#\'}$;\5
$\\{xchr}[\O44]\K\.{\'\$\'}$;\5
$\\{xchr}[\O45]\K\.{\'\%\'}$;\5
$\\{xchr}[\O46]\K\.{\'\&\'}$;\5
$\\{xchr}[\O47]\K\.{\'\'}\.{\'\'}$;\6
$\\{xchr}[\O50]\K\.{\'(\'}$;\5
$\\{xchr}[\O51]\K\.{\')\'}$;\5
$\\{xchr}[\O52]\K\.{\'*\'}$;\5
$\\{xchr}[\O53]\K\.{\'+\'}$;\5
$\\{xchr}[\O54]\K\.{\',\'}$;\5
$\\{xchr}[\O55]\K\.{\'-\'}$;\5
$\\{xchr}[\O56]\K\.{\'.\'}$;\5
$\\{xchr}[\O57]\K\.{\'/\'}$;\6
$\\{xchr}[\O60]\K\.{\'0\'}$;\5
$\\{xchr}[\O61]\K\.{\'1\'}$;\5
$\\{xchr}[\O62]\K\.{\'2\'}$;\5
$\\{xchr}[\O63]\K\.{\'3\'}$;\5
$\\{xchr}[\O64]\K\.{\'4\'}$;\5
$\\{xchr}[\O65]\K\.{\'5\'}$;\5
$\\{xchr}[\O66]\K\.{\'6\'}$;\5
$\\{xchr}[\O67]\K\.{\'7\'}$;\6
$\\{xchr}[\O70]\K\.{\'8\'}$;\5
$\\{xchr}[\O71]\K\.{\'9\'}$;\5
$\\{xchr}[\O72]\K\.{\':\'}$;\5
$\\{xchr}[\O73]\K\.{\';\'}$;\5
$\\{xchr}[\O74]\K\.{\'<\'}$;\5
$\\{xchr}[\O75]\K\.{\'=\'}$;\5
$\\{xchr}[\O76]\K\.{\'>\'}$;\5
$\\{xchr}[\O77]\K\.{\'?\'}$;\6
$\\{xchr}[\O100]\K\.{\'@\'}$;\5
$\\{xchr}[\O101]\K\.{\'A\'}$;\5
$\\{xchr}[\O102]\K\.{\'B\'}$;\5
$\\{xchr}[\O103]\K\.{\'C\'}$;\5
$\\{xchr}[\O104]\K\.{\'D\'}$;\5
$\\{xchr}[\O105]\K\.{\'E\'}$;\5
$\\{xchr}[\O106]\K\.{\'F\'}$;\5
$\\{xchr}[\O107]\K\.{\'G\'}$;\6
$\\{xchr}[\O110]\K\.{\'H\'}$;\5
$\\{xchr}[\O111]\K\.{\'I\'}$;\5
$\\{xchr}[\O112]\K\.{\'J\'}$;\5
$\\{xchr}[\O113]\K\.{\'K\'}$;\5
$\\{xchr}[\O114]\K\.{\'L\'}$;\5
$\\{xchr}[\O115]\K\.{\'M\'}$;\5
$\\{xchr}[\O116]\K\.{\'N\'}$;\5
$\\{xchr}[\O117]\K\.{\'O\'}$;\6
$\\{xchr}[\O120]\K\.{\'P\'}$;\5
$\\{xchr}[\O121]\K\.{\'Q\'}$;\5
$\\{xchr}[\O122]\K\.{\'R\'}$;\5
$\\{xchr}[\O123]\K\.{\'S\'}$;\5
$\\{xchr}[\O124]\K\.{\'T\'}$;\5
$\\{xchr}[\O125]\K\.{\'U\'}$;\5
$\\{xchr}[\O126]\K\.{\'V\'}$;\5
$\\{xchr}[\O127]\K\.{\'W\'}$;\6
$\\{xchr}[\O130]\K\.{\'X\'}$;\5
$\\{xchr}[\O131]\K\.{\'Y\'}$;\5
$\\{xchr}[\O132]\K\.{\'Z\'}$;\5
$\\{xchr}[\O133]\K\.{\'[\'}$;\5
$\\{xchr}[\O134]\K\.{\'\\\'}$;\5
$\\{xchr}[\O135]\K\.{\']\'}$;\5
$\\{xchr}[\O136]\K\.{\'\↑\'}$;\5
$\\{xchr}[\O137]\K\.{\'\_\'}$;\6
$\\{xchr}[\O140]\K\.{\'\`\'}$;\5
$\\{xchr}[\O141]\K\.{\'a\'}$;\5
$\\{xchr}[\O142]\K\.{\'b\'}$;\5
$\\{xchr}[\O143]\K\.{\'c\'}$;\5
$\\{xchr}[\O144]\K\.{\'d\'}$;\5
$\\{xchr}[\O145]\K\.{\'e\'}$;\5
$\\{xchr}[\O146]\K\.{\'f\'}$;\5
$\\{xchr}[\O147]\K\.{\'g\'}$;\6
$\\{xchr}[\O150]\K\.{\'h\'}$;\5
$\\{xchr}[\O151]\K\.{\'i\'}$;\5
$\\{xchr}[\O152]\K\.{\'j\'}$;\5
$\\{xchr}[\O153]\K\.{\'k\'}$;\5
$\\{xchr}[\O154]\K\.{\'l\'}$;\5
$\\{xchr}[\O155]\K\.{\'m\'}$;\5
$\\{xchr}[\O156]\K\.{\'n\'}$;\5
$\\{xchr}[\O157]\K\.{\'o\'}$;\6
$\\{xchr}[\O160]\K\.{\'p\'}$;\5
$\\{xchr}[\O161]\K\.{\'q\'}$;\5
$\\{xchr}[\O162]\K\.{\'r\'}$;\5
$\\{xchr}[\O163]\K\.{\'s\'}$;\5
$\\{xchr}[\O164]\K\.{\'t\'}$;\5
$\\{xchr}[\O165]\K\.{\'u\'}$;\5
$\\{xchr}[\O166]\K\.{\'v\'}$;\5
$\\{xchr}[\O167]\K\.{\'w\'}$;\6
$\\{xchr}[\O170]\K\.{\'x\'}$;\5
$\\{xchr}[\O171]\K\.{\'y\'}$;\5
$\\{xchr}[\O172]\K\.{\'z\'}$;\5
$\\{xchr}[\O173]\K\.{\'\{\'}$;\5
$\\{xchr}[\O174]\K\.{\'|\'}$;\5
$\\{xchr}[\O175]\K\.{\'\}\'}$;\5
$\\{xchr}[\O176]\K\.{\'\~\'}$;\6
$\\{xchr}[0]\K\.{\'\ \'}$;\5
$\\{xchr}[\O177]\K\.{\'\ \'}$;\C{ascii codes 0 and \O177 do not appear in
text}\par
\A sections 10 and 11.
\U section 2.

\M9. Some of the ascii codes without visible characters have been given
symbolic
names in this program because they are used with a special meaning.

\Y\P\D \37$\\{null\_code}=\O0$\C{ascii code that might disappear}\par
\P\D \37$\\{carriage\_return}=\O15$\C{ascii code used at end of line}\par
\P\D \37$\\{invalid\_code}=\O177$\C{ascii code that should not appear}\par

\M10. The ascii code is ``standard'' only to a certain extent, since many
computer installations have found it advantageous to have ready access
to more than 94 printing characters. Appendix@C of the \TeX\ manual
gives a complete specification of the intended correspondence between
characters and \TeX's internal representation.

The code shown here is intended to be used on the Stanford {\sc SAIL} system,
and at other installations like CMU and ISI where essentially the same
extended character set is used. The fact that {\sc SAIL} has \.{\'\}\'} in the
wrong place turns out to cause no difficulty in this case.

\Y\P$\4\X8:Set initial values of key variables\X\mathrel{+}\S$\6
\&{for} $\|i\K1\mathrel{\&{to}}\O37$ \1\&{do}\5
$\\{xchr}[\|i]\K\\{chr}(\|i)$;\2\6
$\\{xchr}[\O30]\K\\{chr}(\O137)$;\5
$\\{xchr}[\O32]\K\\{chr}(\O33)$;\C{\\{not\_equal} sign}\6
$\\{xchr}[\O33]\K\\{chr}(\O176)$;\par


\M11. The following system-independent code makes the \\{xord} array contain a
suitable inverse to the information in \\{xchr}. Note that if $\\{xchr}[\|i]=\\
{xchr}[\|j]$
where $\|i<\|j<\O177$, the value of $\\{xord}[\\{xchr}[\|i]]$ will turn out to
be
\|j or more; hence, standard ascii code numbers will be used instead of
codes below \O40 in case there is a coincidence.

\Y\P$\4\X8:Set initial values of key variables\X\mathrel{+}\S$\6
\&{for} $\|i\K\\{first\_text\_char}\mathrel{\&{to}}\\{last\_text\_char}$ \1\&
{do}\5
$\\{xord}[\\{chr}(\|i)]\K\\{invalid\_code}$;\2\6
\&{for} $\|i\K1\mathrel{\&{to}}\O176$ \1\&{do}\5
$\\{xord}[\\{xchr}[\|i]]\K\|i$;\2\par

\N12.  String handling.
(The following material is copied from the \\{init\_strings} procedure of
\TeX82, with slight changes.)

\Y\P$\4\X7:Globals in the outer block\X\mathrel{+}\S$\6
\4$\|k,\39\|l$: \37$0\to127$;\C{small indices or counters}\6
\4$\|m,\39\|n$: \37\\{text\_char};\C{characters input from \\{pool\_file}}\6
\4\|s: \37\\{integer};\C{number of strings treated so far}\par

\M13. This is the main program, where \.{POOLtype} starts and ends.

\Y\P\D \37$\\{abort}(\#)\S$\1\6
\&{begin} \37$\\{write\_ln}(\#)$;\5
\&{goto} \379999;\6
\&{end}\2\par
\Y\P\&{begin} \37\\{initialize};\6
\X14:Make the first 128 strings\X;\6
$\|s\K128$;\6
\X17:Read the other strings from the \.{POOL} file, or give an error message
and abort\X;\6
\49999: \37\&{end}.\par

\M14. \P$\X14:Make the first 128 strings\X\S$\6
\&{for} $\|k\K0\mathrel{\&{to}}127$ \1\&{do}\6
\&{begin} \37$\\{write}(\|k:3,\39\.{\':\ "\'})$;\6
\&{if} $(\|k<\.{"\ "})\W(\X15:Character \|k cannot be printed\X)$ \1\&{then}\5
$\\{write}(\\{xchr}[\.{"\↑"}],\39\\{xchr}[\.{"\↑"}],\39\\{xchr}[\|k+\O100])$\6
\4\&{else} \&{if} $\|k=127$ \1\&{then}\5
$\\{write}(\\{xchr}[\.{"\↑"}],\39\\{xchr}[\.{"\↑"}],\39\\{xchr}[\.{"?"}])$\6
\4\&{else} \&{if} $\|k=\.{""}\.{""}$ \1\&{then}\5
$\\{write}(\\{xchr}[\|k],\39\\{xchr}[\|k])$\6
\4\&{else} $\\{write}(\\{xchr}[\|k])$;\2\2\2\6
$\\{write\_ln}(\.{\'"\'})$;\6
\&{end}\2\par
\U section 13.

\M15. The first 128 strings will contain 95 standard ascii characters, and the
other 33 characters will be printed in three-symbol form like `\.{\↑\↑A}'
unless a system-dependent change is made here. Installations that have
an extended character set, where for example $\\{xchr}[\O32]=\hbox{\.{\'\NE\'
}}$,
would like string \O32 to be the single character \O32 instead of the
three characters \O136, \O136, \O132 (\.{\↑\↑Z}). On the other hand,
even people with an extended character set will want to represent string
\O15 by \.{\↑\↑M}, since \O15 is \\{carriage\_return}; the idea is to
produce visible strings instead of tabs or line-feeds or carriage-returns
or bell-rings or characters that are treated anomalously in text files.

The boolean expression defined here should be \\{true} unless \TeX\ internal
code
$k$ corresponds to a non-troublesome visible symbol in the local character
set, given that $\|k<\O40$.
At MIT, for example, the appropriate formula would be
`$\|k\in[0,\O10\to\O12,\O14,\O15,\O33]$'.

\Y\P$\4\X15:Character \|k cannot be printed\X\S$\6
$\|k\in[0,\39\O11\to\O15,\39\O33]$\par
\U section 14.

\M16. When the \.{WEB} system program called \.{TANGLE} processes a source
file,
it outputs a \PASCAL\ program and also a string pool file. The present
program reads the latter file, where each string appears as a two-digit decimal
length followed by the string itself, and the information is output with its
associated index number. The strings are surrounded by double-quote marks;
double-quotes in the string itself are repeated.

\Y\P$\4\X7:Globals in the outer block\X\mathrel{+}\S$\6
\4\\{pool\_file}: \37\&{packed} \37\&{file} \1\&{of}\5
\\{text\_char};\C{the string-pool file output by \.{TANGLE}}\2\par

\M17. \P$\X17:Read the other strings from the \.{POOL} file, or give an error
message and abort\X\S$\6
$\\{reset}(\\{pool\_file})$;\6
\&{if} $\R\\{eof}(\\{pool\_file})$ \1\&{then}\6
\1\&{repeat} \37\X18:Read one string, but abort if there are problems\X;\6
\4\&{until}\5
$\\{eof}(\\{pool\_file})$\2\6
\4\&{else} $\\{abort}(\.{\'!\ I\ can\'}\.{\'t\ read\ the\ POOL\ file.\'})$\2\par
\U section 13.

\M18. \P$\X18:Read one string, but abort if there are problems\X\S$\6
\&{begin} \37$\\{read}(\\{pool\_file},\39\|m,\39\|n)$;\C{read two digits of
string length}\6
\&{if} $(\\{xord}[\|m]<\.{"0"})\V(\\{xord}[\|m]>\.{"9"})\V(\\{xord}[\|n]<\.
{"0"})\V(\\{xord}[\|n]>\.{"9"})$ \1\&{then}\5
$\\{abort}(\.{\'!\ POOL\ line\ doesn\'}\.{\'t\ begin\ with\ two\ digits\'})$;\2
\6
$\|l\K\\{xord}[\|m]\ast10+\\{xord}[\|n]-\.{"0"}\ast11$;\C{compute the length}\6
$\\{write}(\|s:3,\39\.{\':\ "\'})$;\6
\&{for} $\|k\K1\mathrel{\&{to}}\|l$ \1\&{do}\6
\&{begin} \37\&{if} $\\{eoln}(\\{pool\_file})$ \1\&{then}\6
\&{begin} \37$\\{write\_ln}(\.{\'"\'})$;\5
$\\{abort}(\.{\'!\ That\ POOL\ line\ was\ too\ short\'})$;\6
\&{end};\2\6
$\\{read}(\\{pool\_file},\39\|m)$;\5
$\\{write}(\\{xchr}[\\{xord}[\|m]])$;\6
\&{if} $\\{xord}[\|m]=\.{""}\.{""}$ \1\&{then}\5
$\\{write}(\\{xchr}[\.{""}\.{""}])$;\2\6
\&{end};\2\6
$\\{read\_ln}(\\{pool\_file})$;\5
$\\{write\_ln}(\.{\'"\'})$;\5
$\\{incr}(\|s)$;\6
\&{end}\par
\U section 17.

\N19.  System-dependent changes.
This module should be replaced, if necessary, by changes to the program
that are necessary to make \.{PLtoTF} work at a particular installation.
It is usually best to design your change file so that all changes to
previous modules preserve the module numbering; then everybody's version
will be consistent with the printed program. More extensive changes,
which introduce new modules, can be inserted here; then only the index
itself will get a new module number.

\N20.  Index.
Pointers to error messages appear here together with the section numbers
where each ident\-i\-fier is used.

\inx
\+\\{abort}, \[13], 17, 18.
\+{ascii code}, 4.
\+\\{ascii\_code}, \[5], 6, 7.
\+\&{begin}, \[2].
\+\\{carriage\_return}, \[9], 15.
\+{changes for {\mc SAIL}}, 2, 10, 15.
\+\\{char}, 6.
\+{character set dependencies}, 15.
\+\\{chr}, 6, 7, 10, 11.
\+\\{decr}, \[3].
\+\\{do\_nothing}, \[3].
\+\\{eof}, 17.
\+\\{eoln}, 18.
\+\\{first\_text\_char}, \[6], 11.
\+\\{incr}, \[3], 18.
\+\\{init\_strings}, 12.
\+\\{initialize}, \[2], 13.
\+\\{integer}, 12.
\+\\{invalid\_code}, \[9], 11.
\+\|{k}, \[12].
\+\|{l}, \[12].
\+\\{last\_text\_char}, \[6], 11.
\+\|{m}, \[12].
\+\|{n}, \[12].
\+\\{not\_equal}, 10.
\+\\{null\_code}, \[9].
\+\\{ord}, 7.
\+\\{output}, \[2].
\+\\{pool\_file}, \[2], 12, 16, 17, 18.
\+\\{POOLtype}, \[2].
\+\\{read}, 18.
\+\\{read\_ln}, 18.
\+\\{reset}, 17.
\+\|{s}, \[12].
\+{system dependencies}, 2, 6, 10, 15, 19.
\+\\{text\_char}, \[6], 7, 12, 16.
\+\\{true}, 15.
\+\\{write}, 14, 18.
\+\\{write\_ln}, 13, 14, 18.
\+\\{xchr}, \[7], 8, 10, 11, 14, 15, 18.
\+\\{xord}, \[7], 11, 18.
\fin
\+\X15:Character \|k cannot be printed\X
\+\X7:Globals in the outer block\X
\+\X6:Local variables for initialization\X
\+\X14:Make the first 128 strings\X
\+\X18:Read one string, but abort if there are problems\X
\+\X17:Read the other strings from the \.{POOL} file, or give an error message
and abort\X
\+\X8:Set initial values of key variables\X
\+\X5:Types in the outer block\X
\con